package com.design.pattern.sixprinciple.singleprinciple;

/**
 * 单一职责
 *
 * @author gyf
 * @create 2018-12-20 19:14
 * <p>
 * <p>
 * 一个优良的系统设计，强调模块间保持低耦合、高内聚的关系，在面向对象设计中这条规则同样适用，
 * 所以面向对象的第一个设计原则就是：单一职责原则（SRP，Single Responsibility Principle）。
 * <p>
 * 单一职责强调的是职责分离,在某种程度上对职责的理解,是构成了不同类之间的耦合关系的设计关键,
 * 单一职责原则或多或少成为设计过程中一个必须考虑的基础性原则。
 * <p>
 * <p>
 *     单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申，将职责定义为引起变化的原因，
 * 以提高内聚性来减少引起变化的原因。职责过多，可能引起它变化的原因就越多，这将导致职责依赖，
 * 相互之间就产生影响，从而极大的损伤其内聚性和耦合度。单一职责，通常意味着单一的功能，
 * 因此不要为类实现过多的功能点，以保证实体只有一个引起它变化的原因。
 * <p>
 *                         正方形
 *                         Draw();
 * 图形计算程序 ---------->Area(); <----------图形绘制程序
 **/
public class SinglePrinciple {

    public static void main(String args[]) {
        //以上 图形计算程序只使用了正方形的Area()方法，永远不会使用Draw()方法，
        // 而它却跟Draw方法关联了起来。这违反了单一原则，如果未来因为图形绘制程序导致Draw()方法产生了变化，
        // 那么就会影响到本来毫不关系的图形计算程序。
        Program programArea = new AreaCount();
        Program programDraw = new DrawGraph();
        programArea.area();
        programDraw.draw();

        //应该把接口改成2个，将不同的职责分配给不同的类，使单个类的职责尽量单一，就隔离了变化，这样他们也不会互相影响了。
    }
    //应该program分成两个两个接口,一个负责draw，一个负责area
}
